package com.sky.common.utils;

/**
 * 地理工具类
 */
public class GeoUtils {

    /**
     * 地球半径
     */
    public  static final double EARTH_RADIUS = 6371000;

    /**
     * 计算两个经纬度坐标点之间的直线距离（以米为单位）
     *
     * @param lat1 纬度1
     * @param lng1 经度1
     * @param lat2 纬度2
     * @param lng2 经度2
     * @return 两坐标点之间的直线距离（米）
     */
    public static double calculateDistance(double lat1, double lng1, double lat2, double lng2) {
        // 将经纬度转为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lng1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lng2);

        // 使用Haversine公式计算两点之间的距离
        double dLat = lat2Rad - lat1Rad;
        double dLon = lon2Rad - lon1Rad;
        double a = Math.pow(Math.sin(dLat / 2), 2) +
                Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.pow(Math.sin(dLon / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        return EARTH_RADIUS * c ;
    }

    /**
     * 点位移动
     * @param lng 原来的经度
     * @param lat 原来的维度
     * @param northMoveMeters 向北移动距离
     * @param eastMoveMeters 向东移动距离
     * @return 新的经纬度
     */
    public static double[] movePoint(double lng,double lat, double northMoveMeters, double eastMoveMeters) {
        // 将纬度转换为弧度
        double latRad = Math.toRadians(lat);
        double lngRad = Math.toRadians(lng);

        // 计算新的纬度
        double newLatRad = latRad + (northMoveMeters / EARTH_RADIUS);
        double newLat = Math.toDegrees(newLatRad);

        // 计算新的经度
        double newLngRad = lngRad + (eastMoveMeters / (EARTH_RADIUS * Math.cos(latRad)));
        double newLng = Math.toDegrees(newLngRad);

        // 返回新经纬度，保留6位小数
        return new double[] {
                NumberUtil.round(newLng,6),
               NumberUtil.round(newLat,6)
        };
    }


    public static void main(String[] args) {
        double lat1 = 30.56909840;
        double lon1 = 104.03609240;
        // 设这是稍微向北移动一点的纬度
        double lat2 = 30.5701429;
        // 经度不变
        double lon2 = 104.036092;
        double distance = calculateDistance(lat1, lon1, lat2, lon2);
        System.out.printf("两点之间的距离是：%.2f米%n", distance);
    }
}
